with Ada.Text_Io; use Ada.Text_Io;
with Dictionnaires;
with Ada.Command_Line;

procedure Test_Dico_Unitaire is

   Taille: constant Positive := 5;

   function Hash_3der(Mot: String) return Natural is
   begin
      if Mot'Length >= 3 then
         return Character'Pos(Mot(Mot'last)) + Character'Pos(Mot(Mot'Last-1)) +
           Character'Pos(Mot(Mot'Last-2));
      elsif Mot'Length =2 then
         return Character'Pos(Mot(Mot'last)) + Character'Pos(Mot(Mot'Last-1));
      else -- mot'length=1
         return Character'Pos(Mot(Mot'last));
      end if;
   end Hash_3der;

   package Dico_Hash_3der is new Dictionnaires(Taille, False, Hash_3der);

   Fich: File_Type; -- fichier de test contenant un dictionnaire
   -- dictionnaire :
   Dhb: Dico_Hash_3der.Dictionnaire := Dico_Hash_3der.Cree_Dico;

   Trouve : Boolean;
   laDef : Dico_Hash_3der.Definition;

   -- compteur qui nous permet de savoir si le test est passé ou a échoué
   cptTest : Natural := 0;
begin

   declare -- un nouveau bloc
         S: String := "dico_unitaire.txt";
   begin
      Open(Fich, In_File, S);
      -- si on arrive ici ça veut dire qu'il n'y a pas eu d'exception
      -- et que le fichier existe
      cptTest := cptTest + 1;
   exception
      when Name_Error => Put_Line("Error: fichier inexistant !"); return;
   end;

   -- remplissage du dictionnaire
   Dico_Hash_3der.Remplit_Dico(Fich, Dhb);

   -- suppresion mot "quatremot"
   Dico_Hash_3der.Supprime(Dhb, Dico_Hash_3der.Cree_Mot("quatremot"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("Error: quatremot a été trouvé alors qu'il n'existe pas, voici la définition : " & laDef.S);
   else
      -- quatremot n'existe pas, on incremente
      cptTest := cptTest + 1;
   end if;

   Dico_Hash_3der.Trouve(Dhb, Dico_Hash_3der.Cree_Mot("nawak"), Trouve, laDef);
   if Trouve then
      Ada.Text_Io.Put_Line("Error: nawak a été trouvé alors qu'il n'existe pas, voici la définition : " & laDef.S);
   else
      -- nawak n'existe pas, on incremente
      cptTest := cptTest + 1;
   end if;

   Dico_Hash_3der.Trouve(Dhb, Dico_Hash_3der.Cree_Mot("lemot"), Trouve, laDef);
   if Trouve then
      -- le_mot existe, on incremente
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: le_mot n'a pas été trouvé alors qu'il existe");
   end if;

   Dico_Hash_3der.Vider(Dhb);

   -- on test si le dico a bien été vidé
   if Dico_Hash_3der.GetTaille(Dhb) = 0 then
      cptTest := cptTest + 1;
   else
      Ada.Text_Io.Put_Line("Error: la table de hachage n'a pas été bien vidée");
   end if;

   -- fermeture du fichier test
   Close(Fich);

   -- on test si les 23 tests se sont bien réalisés
   if cptTest = 5 then
      Ada.Command_Line.Set_Exit_Status (Code => Ada.Command_Line.Success);
   else
      Ada.Command_Line.Set_Exit_Status (Code => Ada.Command_Line.Failure);
   end if;

end Test_Dico_Unitaire;
